      1  import java.util.ArrayList;

      2

      3  /**

      4     Describes an invoice for a set of purchased products.

      5  */

      6  public class Invoice

      7  {

      8     private Address billingAddress;

      9     private ArrayList<LineItem> items;

     10

     11     /**

     12        Constructs an invoice.

     13        @param anAddress the billing address

     14     */

     15     public Invoice(Address anAddress)

     16     {

     17        items = new ArrayList<LineItem>();

     18        billingAddress = anAddress;

     19     }

     20

     21     /**

     22        Adds a charge for a product to this invoice.

     23        @param aProduct the product that the customer ordered

     24        @param quantity the quantity of the product

     25     */

     26     public void add(Product aProduct, int quantity)

     27     {

     28        LineItem anItem = new LineItem(aProduct, quantity);

     29        items.add(anItem);

     30     }

     31

     32     /**

     33        Formats the invoice.

     34        @return the formatted invoice

     35     */

     36     public String format()

     37     {

     38        String r =  "                     I N V O I C E\n\n"

     39              + billingAddress.format()

     40              + String.format("\n\n%-30s%8s%5s%8s\n",

     41                 "Description", "Price", "Qty", "Total");

     42

     43        for (LineItem item : items)

     44        {

     45           r = r + item.format() + "\n";

     46        }

     47

     48        r = r + String.format("\nAMOUNT DUE: $%8.2f", getAmountDue());

     49

     50        return r;

     51     }

     52

     53     /**

     54        Computes the total amount due.

     55        @return the amount due

     56     */

     57     private double getAmountDue()

     58     {

     59        double amountDue = 0;

     60        for (LineItem item : items)

     61        {

     62           amountDue = amountDue + item.getTotalPrice();

     63        }

     64        return amountDue;

     65     }

     66  }